package com.sss.portalrimac.web.registro.service.impl;

import java.util.Date;

import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;

import org.apache.commons.lang.NotImplementedException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.sss.portalrimac.application.ClienteService;
import com.sss.portalrimac.domain.Cliente;
import com.sss.portalrimac.domain.command.CambioContrasenaCommand;
import com.sss.portalrimac.domain.command.RecuperarContrasenaCommand;
import com.sss.portalrimac.infraestructure.configuration.ConfigurationManager;
import com.sss.portalrimac.infraestructure.email.ConstanciaRegistroEmail;
import com.sss.portalrimac.infraestructure.email.EmailSender;
import com.sss.portalrimac.infraestructure.email.RegistroEmail;
import com.sss.portalrimac.infraestructure.exception.DomainException;
import com.sss.portalrimac.infraestructure.ldap.ClienteLdap;
import com.sss.portalrimac.infraestructure.ldap.ClienteLdapFactory;
import com.sss.portalrimac.infraestructure.share.PasswordGenerator;
import com.sss.portalrimac.infraestructure.ws.PersonaWS;
import com.sss.portalrimac.infraestructure.ws.request.dto.ObtenerDatosPersonaTO;

@Service("personaJuridicaService")
public class PersonaJuridicaServiceImpl implements ClienteService
{
	public final Log logger = LogFactory.getLog(this.getClass());
	@Autowired
	private ConfigurationManager configurationManager;
	@Autowired
	private ClienteLdapFactory clienteLdapFactory;
	@Autowired
	private EmailSender emailSender;
	@Autowired
	private PasswordGenerator passwordGenerator;
	@Autowired
	private PersonaWS personaWS;

	public void registrarCliente(PortletRequest request, PortletResponse response, Cliente command) throws Exception
	{
		ClienteLdap clienteLdap = clienteLdapFactory.create(request, response);
		ObtenerDatosPersonaTO to = new ObtenerDatosPersonaTO(command.getTipoDocumento(), command.getNumeroDocumento(),
				"S", Boolean.valueOf(command.getAceptoTerminos()), Boolean.valueOf(command.getDeseoInformacion()));
		Cliente clienteEnLdap = clienteLdap.obtenerClienteByAtributo("uid", command.getNumeroDocumento());
		if ((clienteEnLdap != null) && (clienteEnLdap.getEstado() != null)
				&& (clienteEnLdap.getEstado() == Cliente.CLIENTE_REGISTRADO))
		{
			throw new DomainException("002", "cliente ya registrado en el portal");
		}
		Cliente cliente = this.personaWS.obtenerDatosTipDocNroDoc(to);
		if (cliente == null)
		{
			throw new DomainException("001", "cliente no existe");
		}
		// FIXME para personas juridicas que cn se va a registrar? Por ahora se asume que la razon social viene en el
		// campo nombre. Se debe validar este dato.
		cliente.setCn(cliente.getNombre());
		cliente.setUid(command.getNumeroDocumento());
		cliente.setContrasena(this.passwordGenerator.generate());
		cliente.cambiarPreguntaYRespuesta(command.getPreguntaSeguridad(), command.getRespuestaSeguridad());
		cliente.setDebeCambiarContrasena(true);
		cliente.setFechaRegistroPortal(new Date());
		cliente.setEstado(Cliente.CLIENTE_REGISTRADO);
		cliente.setNumeroDocumento(command.getNumeroDocumento());
		cliente.setTipoDocumento(command.getTipoDocumento());
		cliente.setCorreoElectronico(command.getCorreoElectronico());
		ConstanciaRegistroEmail constanciaRegistroEmail = new ConstanciaRegistroEmail(this.configurationManager,
				cliente, request.getServerName(), Integer.toString(request.getServerPort()));
		constanciaRegistroEmail.setMailExistente(cliente, command);
		logger.info("[MSG]createCliente,  =>cliente :" + cliente);
		clienteLdap.create(cliente);
		RegistroEmail registroEmail = new RegistroEmail(this.configurationManager, cliente.getCorreoElectronico(),
				cliente.getUid(), cliente.getNombre(), cliente.getContrasena(), request.getServerName(),
				Integer.toString(request.getServerPort()));
		this.emailSender.Send(registroEmail);
		this.emailSender.Send(constanciaRegistroEmail);
	}

	public void cambiarContrasena(PortletRequest arg0, PortletResponse arg1, CambioContrasenaCommand arg2)
			throws Exception
	{
		throw new NotImplementedException();
	}

	public Cliente obtenerClienteActual(PortletRequest arg0, PortletResponse arg1) throws Exception
	{
		throw new NotImplementedException();
	}

	public Cliente obtenerClienteConDatosActualizados(PortletRequest arg0, PortletResponse arg1) throws Exception
	{
		throw new NotImplementedException();
	}

	public Cliente obtenerClienteDni(PortletRequest arg0, PortletResponse arg1, String arg2) throws Exception
	{
		throw new NotImplementedException();
	}

	public void recuperarContrasena(PortletRequest arg0, PortletResponse arg1, RecuperarContrasenaCommand arg2)
			throws Exception
	{
		throw new NotImplementedException();
	}
}
